<?php
/*
 * 创建于2020-06-03 10:08:51
 * 力扣题库之--两数之和
 *
 *
 * 给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
 *
 *
 * 示例:
 * 给定 nums = [2, 7, 11, 15], target = 9
 * 因为 nums[0] + nums[1] = 2 + 7 = 9
 * 所以返回 [0, 1]
 */


class Solution {

    /**
     * 初次提交，提交结果为解答错误，没有判断该差值是否为值本身
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($nums, $target) {
        foreach($nums as $key=>$val){
            $diff = $target - $val;
            if(in_array($diff, $nums)){
                return [$key, array_search($diff, $nums)];
            }else{
                continue;
            }
        }
        return [];
    }

    /**
     * 修改后再次提交，提交结果为通过，不过效率不高，执行用时124ms，内存消耗15.7MB
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum2($nums, $target) {
        foreach($nums as $key=>$val){
            $diff = $target - $val;
            if(in_array($diff, $nums)){
                $diffs = array_keys($nums, $diff);
                if(count($diffs) > 1){
                    return [$key, $diffs[1]];
                }elseif ($diff != $val){
                    return [$key, $diffs[0]];
                }
            }else{
                continue;
            }
        }
        return [];
    }

    /**
     * 别人的题解，执行用时12ms，内存消耗16MB
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum3($nums, $target) {
        $d = 0;
        $f = [];
        $c = count($nums);
        for ($i = 0; $i < $c; ++$i) {
            $d = $target - $nums[$i];
            if (array_key_exists($d, $f)) {
                return [$f[$d], $i];
            }
            $f[$nums[$i]] = $i;
        }
    }

}


$solution = new Solution();
$arr = $solution->twoSum3([3, 3, 3, 11, 15], 6);
print_r($arr);
?>